<?php

namespace IYUU\sdk\CoolQ;

/**
 * 此class只用于获取特定CQ码，并没有真正的调用API
 * Class CoolQCode
 * @package IYUU\sdk\CoolQ
 */
class CoolQCode
{
    /**
     * 取CQ码
     * @param $type
     * @param null $argArray
     * @return string
     */
    public static function CQ($type, $argArray = null): string
    {
        $code = '[CQ:' . $type;
        if (null !== $argArray) {
            foreach ($argArray as $key => $value) {
                $code .= (',' . $key . '=' . self::EncodeCQCode($value));
            }
        }
        $code .= ']';
        return $code;
    }

    /**
     * @某人(at)
     * @param number $qq 要艾特的QQ号，-1 为全体
     * @return string CQ码_At
     */
    public static function At($qq): string
    {
        if ($qq === -1) {
            $qq = 'all';
        }
        return self::CQ('at', ['qq' => $qq]);
    }

    /**
     * 发送表情(face)
     * @param int $id 表情ID，0 ~ 200+
     * @return string CQ码_表情
     */
    public static function Face(int $id): string
    {
        return self::CQ('face', ['id' => $id]);
    }

    /**
     * 大表情
     * @param int $id 大表情的唯一标识
     * @return string CQ码_大表情
     */
    public static function BFace(int $id): string
    {
        return self::CQ('bface', ['id' => $id]);
    }

    /**
     * 小表情
     * @param int $id 小表情的唯一标识
     * @return string CQ码_小表情
     */
    public static function SFace(int $id): string
    {
        return self::CQ('sface', ['id' => $id]);
    }

    /**
     * 发送Emoji表情(emoji)
     * @param int $id 表情ID，emoji的unicode编号
     * @return string CQ码_emoji
     */
    public static function Emoji(int $id): string
    {
        return self::CQ('emoji', ['id' => $id]);
    }

    /**
     * 取CQ码_图片
     * @param string $file 图片路径，可使用网络和本地文件．使用本地语音文件时需在路径前加入 file://
     * @return string CQ码_图片
     */
    public static function Image(string $file): string
    {
        return self::CQ('image', ['file' => $file]);
    }

    /**
     * base64发送图片
     * @param string $str 图片（字符串形式）
     * @return string 图片对应的 base64 格式 CQ码
     */
    public static function sendImg(string $str): string
    {
        return self::Image('base64://' . base64_encode($str));
    }

    /**
     * 取CQ码_语音
     * @param string $file 语音路径，可使用网络和本地语音文件．使用本地语音文件时需在路径前加入 file://
     * @return string CQ码_语音
     */
    public static function Record(string $file): string
    {
        return self::CQ('record', ['file' => $file]);
    }

    /**
     * base64发送录音
     * @param string $str 录音（字符串形式）
     * @return string 录音对应的 base64 格式 CQ码
     */
    public static function sendRec(string $str): string
    {
        return self::Record('base64://' . base64_encode($str));
    }

    /**
     * @param $type
     * @return string
     */
    public static function Rps($type): string
    {
        return self::CQ('rps', ['type' => $type]);
    }

    /**
     * @param $type
     * @return string
     */
    public static function Dice($type): string
    {
        return self::CQ('dice', ['type' => $type]);
    }

    /**
     * 发送窗口抖动(shake) - 仅支持好友，腾讯已将其改名为戳一戳
     * @return string
     */
    public static function Shake(): string
    {
        return self::CQ('shake');
    }

    /**
     * 匿名发消息（anonymous），仅支持群
     * @param boolean $ignore 是否不强制，默认为 false,如果希望匿名失败时，将消息转为普通消息发送（而不是取消发送），请置本参数为 true
     * @return string CQ码_匿名
     */
    public static function Anonymous(bool $ignore): string
    {
        return $ignore ? self::CQ('anonymous', ['ignore' => 'true']) : self::CQ('anonymous');
    }

    /**
     * 取CQ码_音乐(music)
     * @param string $type 音乐网站类型，目前支持 qq/QQ音乐 163/网易云音乐 xiami/虾米音乐，默认为qq
     * @param number $id 音乐的歌曲数字ID
     * @return string       CQ码_音乐
     */
    public static function Music(string $type, $id): string
    {
        return self::CQ('music', [
            'type' => $type,
            'id' => $id,
        ]);
    }

    /**
     * 取CQ码_音乐自定义分享(music)
     * @param string $audio 音频链接，音乐的音频链接（如mp3链接）
     * @param string $url 分享链接，点击分享后进入的音乐页面（如歌曲介绍页）
     * @param string $title 标题，可空，音乐的标题，建议12字以内
     * @param string $content 内容，可空，音乐的简介，建议30字以内
     * @param string $image 封面图片链接，可空，音乐的封面图片链接，留空则为默认图片
     * @return string CQ码_音乐自定义分享
     */
    public static function CustomMusic(string $audio, string $url, string $title, string $content, string $image): string
    {
        return self::CQ('music', [
            'type' => 'custom',
            'audio' => $audio,
            'url' => $url,
            'title' => $title,
            'content' => $content,
            'image' => $image
        ]);
    }

    /**
     * 发送链接分享(share)
     * @param string $url 分享链接，点击卡片后跳转的网页地址
     * @param string $title 标题，可空，分享的标题，建议12字以内
     * @param string $content 内容，可空，分享的简介，建议30字以内
     * @param string $image 图片链接，可空，分享的图片链接，留空则为默认图片
     * @return string CQ码_链接分享
     */
    public static function Share(string $url, string $title, string $content, string $image): string
    {
        return self::CQ('share', [
            'url' => $url,
            'title' => $title,
            'content' => $content,
            'image' => $image,
        ]);
    }

    /**
     * 编码、转义
     * @param $str
     * @return string 转义后的字符串
     */
    public static function EncodeCQCode($str): string
    {
        return str_replace([
            '&',
            '[',
            ']',
            ',',
        ], [
            '&amp;',
            '&#91;',
            '&#93;',
            '&#44;',
        ], $str);
    }

    /**
     * 解码、反转义
     * @param $str
     * @return string 反转义后的字符串
     */
    public static function DecodeCQCode($str): string
    {
        return str_replace([
            '&amp;',
            '&#91;',
            '&#93;',
            '&#44;',
        ], [
            '&',
            '[',
            ']',
            ',',
        ], $str);
    }
}
